package org.shangrila.comm.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.Properties;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 读取properties文件
 * 配置文件在JAVA应用中一般与类放在一起，参数一般写成 "smart.properties" 形式调用 
 * 在WEB应用中要读取的配置文件的路径一般一般放到class根目录下web/WEB-INF/classes/，参数一般写成 "/smart.properties" 形式调用            
 * @author SHANGRILA
 * 
 */
public class MsgsUtil {
    private static final transient Logger log = LoggerFactory.getLogger(MsgsUtil.class);
	
    private static final String WEB_PROPS_FILE = "/smart.properties";
    private static final String JAVA_PROPS_FILE = "/messages.properties";
    private static final String MSGS_PROPS_FILE_ZH = "/messages_zh.properties";
    private static final String MSGS_PROPS_FILE_EN = "/messages_en.properties";
    private static final String MSGS_PROPS_FILE = "/messages.properties";
	public static String MSGS_LOCALE_LANG = "zh"; //zh_CN
	public static final String MSGS_INFO = "";

	//show faces Messages from messages.properties
	//summary--info debug error success failure
	public static String showMsgsInfo(String summary,String detail) {	
		String msummary = getMsgs("java_comm_info_"+summary);
		String mdetail = getMsgs(detail);
		if(msummary!=null && mdetail!=null) {
			FacesMessage message = new FacesMessage(msummary, mdetail);
			FacesContext.getCurrentInstance().addMessage(null, message);
			if(summary.equalsIgnoreCase("info"))
				log.info(mdetail);
			else if(summary.equalsIgnoreCase("debug"))
				log.debug(mdetail);
			else if(summary.equalsIgnoreCase("error"))
				log.error(mdetail);
			else if(summary.equalsIgnoreCase("failure"))
				log.error(mdetail);
			else if(summary.equalsIgnoreCase("success"))
				log.info(mdetail);
			else
				log.info(mdetail);
		}
		else
			return null;
		
		return mdetail;
	}

	//show faces Messages from paras
	//summary--info debug error success failure
	public static FacesMessage showMessages(String summary,String detail) {	

		if(summary!=null && detail!=null) {
			FacesMessage message = new FacesMessage(summary, detail);
			FacesContext.getCurrentInstance().addMessage(null, message);
			if(summary.equalsIgnoreCase("info"))
				log.info(detail);
			else if(summary.equalsIgnoreCase("debug"))
				log.debug(detail);
			else if(summary.equalsIgnoreCase("error"))
				log.error(detail);
			else if(summary.equalsIgnoreCase("failure"))
				log.error(detail);
			else if(summary.equalsIgnoreCase("success"))
				log.info(detail);
			else
				log.info(detail);
			
			return message;
		}
		else
			return null;
		
		
	}

	public static String getMsgs(String keyValue) {
		String valueStr;
		if(MSGS_LOCALE_LANG.equalsIgnoreCase("zh"))
			valueStr = getPropsFromFile(MSGS_PROPS_FILE_ZH,keyValue);
		else if(MSGS_LOCALE_LANG.equalsIgnoreCase("en"))
			valueStr = getPropsFromFile(MSGS_PROPS_FILE_EN,keyValue);
		else 
			valueStr = getPropsFromFile(MSGS_PROPS_FILE,keyValue);
		
		log.info(valueStr);
		return valueStr;
	}
	/*
	 * 读取properties文件
	 * 配置文件在JAVA应用中一般与类放在一起，参数一般写成 "smart.properties" 形式调用 
	 * 在WEB应用中要读取的配置文件的路径一般一般放到class根目录下web/WEB-INF/classes/，参数一般写成 "/smart.properties" 形式调用
	 */
	private static String getPropsFromFile(String file,String keyValue) {
		
		String valueStr="";		
		Properties propertie = new Properties();		
		InputStream is = MsgsUtil.class.getResourceAsStream(file);
		try {
			propertie.load(is);
			is.close();			
			valueStr = propertie.getProperty(keyValue);
		} catch (IOException e) {
			log.info(e.toString());
		}

		return valueStr;
	}

	//从类路径中加载属性文件:参数一般写成 "smart.properties" 形式调用
	private static String getPropsValue(String file,String keyValue) {
		
		String valueStr="";		
		Properties propertie = new Properties();
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		InputStream is = classLoader.getResourceAsStream(file);
		try {
			propertie.load(is);
			is.close();			
			valueStr = propertie.getProperty(keyValue);
		} catch (IOException e) {
			log.info(e.toString());
		}

		return valueStr;
	}

	public static void main(String[] args) {
		
		String msummary = getPropsFromFile(MSGS_PROPS_FILE_ZH,"java_comm_info_"+"info");
		
		System.out.println(msummary);
		
		//String msummary = getPropsValue(MSGS_PROPS_FILE_ZH,"java_comm_info_"+"info");
		
		//System.out.println(msummary);
		
		//System.out.println("JAVA-OK:" +getPropsFromFile(JAVA_PROPS_FILE,"message_warning_login_result"));
		
		//System.out.println("WEB-OK:" + getPropsFromFile(WEB_PROPS_FILE,"upload.path.win"));
		
	}
	
	public static void showLocaleInfo() {

	Locale defaultLocale = Locale.getDefault();
	String country = defaultLocale.getCountry();//返回国家地区代码
	String language = defaultLocale.getLanguage();//返回国家的语言
	String displayCountry = defaultLocale.getDisplayCountry();//返回适合向用户显示的国家信息
	String displayLanaguage = defaultLocale.getDisplayLanguage();//返回适合向用户展示的语言信息
	String displayName = defaultLocale.getDisplayName();//返回适合向用户展示的语言环境名

	System.out.println(defaultLocale);
	System.out.println(country);
	System.out.println(language);
	System.out.println(displayCountry);
	System.out.println(displayLanaguage);
	System.out.println(displayName);
/*
zh_CN
CN
zh
中国
中文
中文 (中国)
*/
}
}
/*
关于绝对路径和相对路径： 
绝对路径就是你的主页上的文件或目录在硬盘上真正的路径，(URL和物理路径)例如：C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。相对路径：相对与某个基准目录的路径。包含Web的相对路径（HTML中的相对目录），例如：在Servlet中，"/"代表Web应用的跟目录。和物理路径的相对表示。例如："./" 代表当前目录,"../"代表上级目录。这种类似的表示，也是属于相对路径。另外关于URI，URL,URN等内容，请参考RFC相关文档标准。RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,(http://www.ietf.org/rfc/rfc2396.txt)2.关于JSP/Servlet中的相对路径和绝对路径。2.1服务器端的地址服务器端的相对地址指的是相对于你的web应用的地址，这个地址是在服务器端解析的（不同于html和javascript中的相对地址，他们是由客户端浏览器解析的） 
	
第一种： 
File f = new File(this.getClass().getResource("/").getPath()); 
System.out.println(f); 
结果: 
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin 
获取当前类的所在工程路径; 
如果不加“/” 
File f = new File(this.getClass().getResource("").getPath()); 
System.out.println(f); 
结果： 
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin\com\test 
获取当前类的绝对路径； 

第二种： 
File directory = new File("");//参数为空 
String courseFile = directory.getCanonicalPath() ; 
System.out.println(courseFile); 
结果： 
C:\Documents and Settings\Administrator\workspace\projectName 
获取当前类的所在工程路径; 

第三种： 
URL xmlpath = this.getClass().getClassLoader().getResource("selected.txt"); 
System.out.println(xmlpath); 
结果： 
file:/C:/Documents%20and%20Settings/Administrator/workspace/projectName/bin/selected.txt 
获取当前工程src目录下selected.txt文件的路径 

第四种： 
System.out.println(System.getProperty("user.dir")); 
结果： 
C:\Documents and Settings\Administrator\workspace\projectName 
获取当前工程路径 

第五种： 
System.out.println( System.getProperty("java.class.path")); 
结果： 
C:\Documents and Settings\Administrator\workspace\projectName\bin 
获取当前工程路径 
 
*/